package com.zzq.util;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;

public class CommonUtils {
    private static final double EARTH_RADIUS_METERS = 6371000.0;
    /**
     * 经度纬度判断工具
     * @param shootLongitude 经度
     * @param shootLatitude 纬度
     * @param targetLongitude 目标经度
     * @param targetLatitude 目标纬度
     * @param radius 目标半径
     * @return
     */
    public static boolean isPointInRadius(BigDecimal shootLongitude, BigDecimal shootLatitude, BigDecimal targetLongitude, BigDecimal targetLatitude, Long radius) {
        // 将经纬度转换为弧度
        double lat1 = Math.toRadians(shootLatitude.doubleValue());
        double lon1 = Math.toRadians(shootLongitude.doubleValue());
        double lat2 = Math.toRadians(targetLatitude.doubleValue());
        double lon2 = Math.toRadians(targetLongitude.doubleValue());

        // 使用 Haversine 公式计算两点之间的距离
        double dlon = lon2 - lon1;
        double dlat = lat2 - lat1;
        double a = Math.sin(dlat / 2) * Math.sin(dlat / 2)
                + Math.cos(lat1) * Math.cos(lat2)
                * Math.sin(dlon / 2) * Math.sin(dlon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS_METERS * c;

        // 比较距离与半径
        return BigDecimal.valueOf(distance).compareTo(BigDecimal.valueOf(radius)) <= 0;
    }

    /**
     *  判断一个时间在上一个时间是否指定天数内
     */

    public static boolean isWithinDays(Date baseDate, Date targetDate, int days) {
        long diff = targetDate.getTime() - baseDate.getTime();
        long dayDifference = diff / (24 * 60 * 60 * 1000);
        return dayDifference >= 0 && dayDifference <= days;
    }

    /**
     * 判断当前时间距目标时间还有多少天
     * @param baseDate
     * @param targetDate
     * @param days
     * @return
     */
    public static int remainingDays(Date baseDate, Date targetDate, int days) {
        long diff = targetDate.getTime() - baseDate.getTime();
        long dayDifference = diff / (24 * 60 * 60 * 1000);

        if (dayDifference < 0) {
            return -1; // 如果目标日期在基准日期之前，返回-1表示不在指定天数内
        }

        int remainingDays = days - (int) dayDifference;
        if (remainingDays<0){
            return 0;
        }
        return remainingDays;
    }

    /**
     * 判断时间是否是同一天
     * @param date1
     * @param date2
     * @return
     */
    public static boolean isSameDay(Date date1, Date date2) {
        // 使用 getTime() 方法获取日期的毫秒数，并比较它们
        return date1.getTime() / (24 * 60 * 60 * 1000) == date2.getTime() / (24 * 60 * 60 * 1000);
    }

    /**
     * 获取当前年份
     * @param date
     * @return
     */

    public static String getCurrentYear(Date date) {
        // 使用 getTime() 方法获取日期的毫秒数，并比较它们
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        // 使用Calendar获取当前年份
        int year = calendar.get(Calendar.YEAR);
        return year+"";
    }

    /**
     * 获取当前月份
     * @param date
     * @return
     */
    public static String getCurrentMonth(Date date) {
        // 使用 getTime() 方法获取日期的毫秒数，并比较它们
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        // 使用Calendar获取当前月份
        int month = calendar.get(Calendar.MONTH)+1;
        return month+"";
    }
    /**
     * 获取当前天数
     * @param date
     * @return
     */
    public static String getCurrentDay(Date date) {
        // 使用 getTime() 方法获取日期的毫秒数，并比较它们
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        // 使用Calendar获取当前年份
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return day+"";
    }


}
